]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
weather: Follow GNOME Weather's location permissions
authorFlorian Müllner <fmuellner@gnome.org>
Sun, 19 Mar 2017 15:29:35 +0000 (16:29 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Mon, 20 Mar 2017 18:13:20 +0000 (19:13 +0100)
Our weather integration should follow GNOME Weather as closely as
possible, which means that we should respect its location permission
rather than using our own or none at all (which we can as a "system"
component and as geoclue's authorization agent).

https://bugzilla.gnome.org/show_bug.cgi?id=780252

js/misc/permissionStore.js
js/misc/weather.js

index b1dbe8664939094b8b71a4500933175d9abce8e4..86c0cd8207326bd764ead4ebf05bf8bf5c427db3 100644 (file)
@@ -17,6 +17,13 @@ const PermissionStoreIface = '<node> \
       <arg name="app_permissions" type="a{sas}" direction="in"/> \
       <arg name="data" type="v" direction="in"/> \
     </method> \
+    <signal name="Changed"> \
+      <arg name="table" type="s" direction="out"/> \
+      <arg name="id" type="s" direction="out"/> \
+      <arg name="deleted" type="b" direction="out"/> \
+      <arg name="data" type="v" direction="out"/> \
+      <arg name="permissions" type="a{sas}" direction="out"/> \
+    </signal> \
   </interface> \
 </node>';
 
index 31ca1926119561213af690b8dd5f88abdf89ccb3..13f29cbd5847f37fc3902ea53df5b25344f12830 100644 (file)
@@ -7,6 +7,7 @@ const GWeather = imports.gi.GWeather;
 const Lang = imports.lang;
 const Signals = imports.signals;
 
+const PermissionStore = imports.misc.permissionStore;
 const Util = imports.misc.util;
 
 // Minimum time between updates to show loading indication
@@ -28,6 +29,25 @@ const WeatherClient = new Lang.Class({
         this._gclueStarting = false;
         this._gclueLocationChangedId = 0;
 
+        this._weatherAuthorized = false;
+        this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
+            if (error) {
+                log('Failed to connect to permissionStore: ' + error.message);
+                return;
+            }
+
+            this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
+                if (error)
+                    log('Error looking up permission: ' + error.message);
+
+                let [perms, data] = error ? [{}, null] : res;
+                let  params = ['gnome', 'geolocation', false, data, perms];
+                this._onPermStoreChanged(this._permStore, '', params);
+            });
+        });
+        this._permStore.connectSignal('Changed',
+                                      Lang.bind(this, this._onPermStoreChanged));
+
         this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' });
         this._locationSettings.connect('changed::enabled',
                                        Lang.bind(this, this._updateAutoLocation));
@@ -87,7 +107,8 @@ const WeatherClient = new Lang.Class({
 
     get _useAutoLocation() {
         return this._autoLocationRequested &&
-               this._locationSettings.get_boolean('enabled');
+               this._locationSettings.get_boolean('enabled') &&
+               this._weatherAuthorized;
     },
 
     _loadInfo: function() {
@@ -205,6 +226,19 @@ const WeatherClient = new Lang.Class({
 
         if (!this._useAutoLocation || !this._gclueStarted)
             this._setLocation(this._mostRecentLocation);
+    },
+
+    _onPermStoreChanged: function(proxy, sender, params) {
+        let [table, id, deleted, data, perms] = params;
+
+        if (table != 'gnome' || id != 'geolocation')
+            return;
+
+        let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
+        let [accuracy] = permission;
+        this._weatherAuthorized = accuracy != 'NONE';
+
+        this._updateAutoLocation();
     }
 });
 Signals.addSignalMethods(WeatherClient.prototype);